﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace OneRed.Data
{
    public class GetTxtEncodingType
    {

        /// <summary>
        /// 取得一个文本文件的编码方式。如果无法在文件头部找到有效的前导符，Encoding.Default将被返回。
        /// </summary>
        /// <param name="fileName">文件名</param>
        /// 
        public static Encoding GetEncoding(string fileName)
        {
            //FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read);
            //Encoding targetEncoding = GetEncoding(fs);
            //fs.Close();
            System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);
            using (var reader=new StreamReader(fileName, Encoding.Default, true))
            {
                //.GetEncoding("GB2312")
                if (reader.Peek() >= 0)
                    reader.Read();
                Encoding targetEncoding = reader.CurrentEncoding;
                reader.Close();
                return targetEncoding;
            }
        }

        /// <summary>
        /// 取得一个文本文件流的编码方式。

        /// </summary>
        /// <param name="stream">文本文件流。</param>

        /// <param name="defaultEncoding">默认编码方式。当该方法无法从文件的头部取得有效的前导符时，将返回该编码方式。</param>
        /// <returns></returns>
        /// 
        public static Encoding GetEncoding(FileStream stream)
        {
            System.IO.BinaryReader br = new System.IO.BinaryReader(stream);
            Byte[] buffer = br.ReadBytes(2);
            if (buffer[0] >= 0xEF)
            {
                if (buffer[0] == 0xEF && buffer[1] == 0xBB)
                {
                    return System.Text.Encoding.UTF8;
                }
                else if (buffer[0] == 0xFE && buffer[1] == 0xFF)
                {
                    return System.Text.Encoding.BigEndianUnicode;
                }
                else if (buffer[0] == 0xFF && buffer[1] == 0xFE)
                {
                    return System.Text.Encoding.Unicode;
                }
                else
                {
                    return System.Text.Encoding.Default;
                }
            }
            else
            {
                return System.Text.Encoding.Default;
            }
            #region 原来方法，但是不正确


            //if (stream != null && stream.Length >= 2)
            //{
            //    //保存文件流的前4个字节
            //    byte byte1 = 0;
            //    byte byte2 = 0;
            //    byte byte3 = 0;
            //    byte byte4 = 0;

            //    //保存当前Seek位置
            //    long origPos = stream.Seek(0, SeekOrigin.Begin);
            //    stream.Seek(0, SeekOrigin.Begin);
            //    int nByte = stream.ReadByte();
            //    byte1 = Convert.ToByte(nByte);
            //    byte2 = Convert.ToByte(stream.ReadByte());

            //    if (stream.Length >= 3)
            //    {
            //        byte3 = Convert.ToByte(stream.ReadByte());
            //    }

            //    if (stream.Length >= 4)
            //    {
            //        byte4 = Convert.ToByte(stream.ReadByte());
            //    }
            //    //根据文件流的前4个字节判断Encoding
            //    //Unicode {0xFF, 0xFE};
            //    //BE-Unicode {0xFE, 0xFF};
            //    //UTF8 = {0xEF, 0xBB, 0xBF};

            //    if (byte1 == 0xFE && byte2 == 0xFF)//UnicodeBe
            //    {
            //        targetEncoding = Encoding.BigEndianUnicode;
            //    }

            //    if (byte1 == 0xFF && byte2 == 0xFE && byte3 != 0xFF)//Unicode
            //    {
            //        targetEncoding = Encoding.Unicode;
            //    }

            //    if (byte1 == 0xEF && byte2 == 0xBB && byte3 == 0xBF)//UTF8
            //    {
            //        targetEncoding = Encoding.UTF8;
            //    }

            //    //恢复Seek位置
            //    stream.Seek(origPos, SeekOrigin.Begin);
            //}
            #endregion
        }
    }
}

